package com.markerhub.mapper;

import com.markerhub.entity.DeliveryOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author by MaXiaofeng
 * @Description 外卖柜相关接口操作 Mapper接口
 * @Date 2022/2/16 21:51
 * @Version 1.0.0
 */
@Mapper
@Repository
public interface OrderMapper {
    /**
     * 外卖员选择存餐，订单形成初始化
     *
     * @param deliveryOrder
     * @return
     */
    public int createOrder(DeliveryOrder deliveryOrder);

    /**
     * 查询当前对应的外卖柜正在使用的柜号
     *
     * @return
     */
    public List<HashMap<String, Integer>> selectUsingCabinetNumber(int cabinetNum);

    /**
     * 根据柜门和柜号来插入外卖放置时间
     *
     * @param putFoodTime
     * @param cabinet_id
     * @param order_doorNum
     * @return
     */
    public int updateTimeOfPutFood(@Param("putFoodTime") Timestamp putFoodTime,
                                   @Param("cabinet_id") int cabinet_id,
                                   @Param("order_doorNum") int order_doorNum);

    /**
     * 根据用户手机号和订单信息去查询对应订单，修改时间和订单状态
     *
     * @param phone
     * @return
     */
    public int updateTimeOfTakeFood(@Param("userId") int userid,
                                    @Param("phone") String phone,
                                    @Param("takeFoodTime") Timestamp takeFoodTime);


    /**
     * 查询出该手机号对应的外卖柜信息
     *
     * @param phone
     * @return
     */
    public List<Map<String, Object>> findByPhone(@Param("phone") String phone);


    /**
     * 检测顾客关闭外卖柜柜门，更改订单状态
     *
     * @param cabinet_id
     * @param order_doorNum
     * @return
     */
    public int updateOrderByCloseDoorByCustomer(@Param("cabinet_id") int cabinet_id,
                                                @Param("order_doorNum") int order_doorNum);

    /**
     * AOP切面，在controller方法执行前更新那些订单超过12小时的订单，使其失效
     *
     * @return
     */
    public int updateTimeValidity();

    /**
     * 根据用户userId，查询对应的订单信息
     *
     * @param userId
     * @return
     */
    List<Map<String, Object>> getHistoryOrder(@Param("userId") int userId);

    /**
     * 根据外卖柜的柜号查询空柜门
     *
     * @param cabinetId
     * @return
     */
    List<Map<String, Object>> findUsedDoorByCabinetId(@Param("cabinetId") int cabinetId);

    /**
     * 根据外卖柜id查找超时柜门
     *
     * @param cabinetId
     * @return
     */
    List<Map<String, Object>> findOverdueDoorByCabinetId(@Param("cabinetId") int cabinetId);
}
